Перейти к основному содержимому

5. GraphQL - демо-данные

Данный раздел содержит полный набор GraphQL-запросов для создания целостной демо-базы данных медицинской информационной системы. Эти данные будут использоваться в дальнейшем для тестирования React-приложения, которое мы будем разрабатывать в следующих разделах курса.

Инструкции по выполнению

  1. Выполняйте запросы строго по порядку - каждый этап зависит от предыдущих
  2. Всего 6 запросов - максимально упрощенный процесс
  3. Выполняйте проверочные запросы после каждого этапа для контроля создания данных
  4. При ошибках - проверьте корректность синтаксиса и наличие зависимых сущностей

Предварительная очистка базы данных

В предыдущем разделе по основам GraphQL мы выполняли большое количество запросов. Для успешного создания демо-данных медицинской клиники в этом разделе критически важно очистить базу данных от существующих данных перед выполнением соответствующих запросов. Для проверки, какие данные сейчас содержатся в базе данных, выполните следующий запрос:

query FinalDemoDataIntegrityCheck {
# Подсчет всех созданных сущностей
doctorTypesCount: searchDoctorType { count }
officeTypesCount: searchOfficeType { count }
personsCount: searchPerson { count }
doctorsCount: searchDoctor { count }
customersCount: searchCustomer { count }
clinicsCount: searchClinic { count }
officesCount: searchClinicOffice { count }
clinicDoctorsCount: searchClinicDoctor { count }
clinicCustomersCount: searchClinicCustomer { count }
clinicSchedulesCount: searchClinicSchedule { count }
doctorSchedulesCount: searchDoctorSchedule { count }
appointmentsCount: searchDoctorAppointment { count }
contactsCount: searchCustomerContact { count }

# Проверка связей
doctorTypes: searchDoctorType {
elems { id name }
}
officeTypes: searchOfficeType {
elems { id name }
}
}

Данный запрос вернёт информацию о количестве экземпляров каждого типа сущностей в базе данных. Далее вам необходимо будет выполнить соответствующие запросы для получения id соответствующих сущностей и их последующего удаления. Вся необходимая информация для подготовки запросов на удаление была предоставлена в предыдущем разделе, при необходимости обратитесь к нему.

К выполнению запросов данного раздела можно будет приступать лишь когда запрос выше будет возвращаться нулевое количество для всех типов сущностей!

Система идентификаторов

По умолчанию в DataSpace CE для генерации идентификаторов сущностей используется алгоритм SNOWFLAKE. Этот алгоритм генерирует уникальные идентификаторы на основе времени и порядкового номера. При этом, если необходимо создать связанный набор демо-данных, возникает необходимость ручного сохранения идентификаторов некоторых сущностей для использования их в запросах создания других сущностей. Чтобы избежать этого, в модели медицинской клиники данного курса для всех сущностей указан (в файле model.xml) механизм создания id AUTO_ON_EMPTY, который позволяет создавать идентификаторы сущностей вручную, при этом если при создании он не будет указываться, то будет создаваться автоматически.

Для простоты и удобства создания демо-данных в этом разделе мы будем использовать систему идентификаторов, которая будет использоваться для всех сущностей. В дальнейшем к ней можно обращаться при подготовке своих запросов и их тестировании.

  • Врачи: doctor-1, doctor-2, doctor-3, doctor-4
  • Пациенты: customer-1, customer-2, customer-3, customer-4
  • Персоны врачей: person-doctor-1 до person-doctor-4
  • Персоны пациентов: person-customer-1 до person-customer-4
  • Клиники: clinic-1, clinic-2, clinic-3
  • Кабинеты: office-1, office-2, office-3, office-4
  • Связи: clinic-doctor-1 до clinic-doctor-4, clinic-customer-1 до clinic-customer-4
  • Расписания: clinic-schedule-1 до clinic-schedule-3, doctor-schedule-1 до doctor-schedule-4
  • Записи: appointment-1 до appointment-5
  • Контакты: customer-contact-1 до customer-contact-4

1. Создание справочников (типы врачей и типы кабинетов)

Справочники не зависят от других сущностей и создаются первыми

mutation CreateAllDictionaries {
dictionaryPacket {
# Типы врачей
therapist: updateOrCreateDoctorType(
input: {
id: "therapist"
name: "Терапевт"
descr: "Врач общей практики"
}
) {
created
returning { id name descr }
}

surgeon: updateOrCreateDoctorType(
input: {
id: "surgeon"
name: "Хирург"
descr: "Врач-специалист по хирургическим операциям"
}
) {
created
returning { id name descr }
}

pediatrician: updateOrCreateDoctorType(
input: {
id: "pediatrician"
name: "Педиатр"
descr: "Врач-специалист по детским болезням"
}
) {
created
returning { id name descr }
}

cardiologist: updateOrCreateDoctorType(
input: {
id: "cardiologist"
name: "Кардиолог"
descr: "Врач-специалист по сердечно-сосудистым заболеваниям"
}
) {
created
returning { id name descr }
}

# Типы кабинетов
consultation: updateOrCreateOfficeType(
input: {
id: "office-type-consultation"
name: "Консультационный кабинет"
}
) {
created
returning { id name }
}

procedure: updateOrCreateOfficeType(
input: {
id: "office-type-procedure"
name: "Процедурный кабинет"
}
) {
created
returning { id name }
}

surgery: updateOrCreateOfficeType(
input: {
id: "office-type-surgery"
name: "Операционная"
}
) {
created
returning { id name }
}
}
}

✅ Проверка создания справочников

query CheckDictionaries {
doctorTypes: searchDoctorType {
elems { id name descr }
}
officeTypes: searchOfficeType {
elems { id name }
}
}

Ожидаемый результат: 4 типа врачей + 3 типа кабинетов


2. Создание персон

mutation CreateAllPersons {
# Персоны врачей - по одной в пакете
p1: packet(idempotencePacketId: "persons-doctors-001") {
person1: createPerson(input: {
id: "person-doctor-1"
firstName: "Анна"
lastName: "Петрова"
birthDate: "1980-05-15"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}

p2: packet(idempotencePacketId: "persons-doctors-002") {
person2: createPerson(input: {
id: "person-doctor-2"
firstName: "Михаил"
lastName: "Сидоров"
birthDate: "1975-09-22"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}

p3: packet(idempotencePacketId: "persons-doctors-003") {
person3: createPerson(input: {
id: "person-doctor-3"
firstName: "Елена"
lastName: "Козлова"
birthDate: "1985-03-10"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}

p4: packet(idempotencePacketId: "persons-doctors-004") {
person4: createPerson(input: {
id: "person-doctor-4"
firstName: "Владимир"
lastName: "Николаев"
birthDate: "1970-01-08"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}

# Персоны пациентов - по одной в пакете
p5: packet(idempotencePacketId: "persons-customers-001") {
person1: createPerson(input: {
id: "person-customer-1"
firstName: "Иван"
lastName: "Иванов"
birthDate: "1990-12-01"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}

p6: packet(idempotencePacketId: "persons-customers-002") {
person2: createPerson(input: {
id: "person-customer-2"
firstName: "Мария"
lastName: "Смирнова"
birthDate: "1985-07-15"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}

p7: packet(idempotencePacketId: "persons-customers-003") {
person3: createPerson(input: {
id: "person-customer-3"
firstName: "Алексей"
lastName: "Волков"
birthDate: "1995-04-20"
sex: MALE
}) {
id firstName lastName sex birthDate
}
}

p8: packet(idempotencePacketId: "persons-customers-004") {
person4: createPerson(input: {
id: "person-customer-4"
firstName: "Татьяна"
lastName: "Федорова"
birthDate: "1988-11-25"
sex: FEMALE
}) {
id firstName lastName sex birthDate
}
}
}

✅ Проверка создания персон

query CheckPersons {
searchPerson {
elems {
id firstName lastName sex birthDate
}
}
}

Ожидаемый результат: 8 персон (4 врача + 4 пациента)


3. Врачи, пациенты, контакты пациентов

mutation CreateMedicalEntities {
# Врачи - по одному в пакете
p1: packet(idempotencePacketId: "doctors-001") {
doctor1: createDoctor(input: {
id: "doctor-1"
doctorType: "therapist"
person: { entityId: "person-doctor-1" }
}) {
id doctorType { id name } person { entityId }
}
}

p2: packet(idempotencePacketId: "doctors-002") {
doctor2: createDoctor(input: {
id: "doctor-2"
doctorType: "surgeon"
person: { entityId: "person-doctor-2" }
}) {
id doctorType { id name } person { entityId }
}
}

p3: packet(idempotencePacketId: "doctors-003") {
doctor3: createDoctor(input: {
id: "doctor-3"
doctorType: "pediatrician"
person: { entityId: "person-doctor-3" }
}) {
id doctorType { id name } person { entityId }
}
}

p4: packet(idempotencePacketId: "doctors-004") {
doctor4: createDoctor(input: {
id: "doctor-4"
doctorType: "cardiologist"
person: { entityId: "person-doctor-4" }
}) {
id doctorType { id name } person { entityId }
}
}

# Пациенты - по одному в пакете
p5: packet(idempotencePacketId: "customers-001") {
customer1: createCustomer(input: {
id: "customer-1"
insuranceNum: "1234567890"
person: { entityId: "person-customer-1" }
}) {
id insuranceNum person { entityId }
}
}

p6: packet(idempotencePacketId: "customers-002") {
customer2: createCustomer(input: {
id: "customer-2"
insuranceNum: "0987654321"
person: { entityId: "person-customer-2" }
}) {
id insuranceNum person { entityId }
}
}

p7: packet(idempotencePacketId: "customers-003") {
customer3: createCustomer(input: {
id: "customer-3"
insuranceNum: "1122334455"
person: { entityId: "person-customer-3" }
}) {
id insuranceNum person { entityId }
}
}

p8: packet(idempotencePacketId: "customers-004") {
customer4: createCustomer(input: {
id: "customer-4"
insuranceNum: "5544332211"
person: { entityId: "person-customer-4" }
}) {
id insuranceNum person { entityId }
}
}

# Контакты пациентов - по одному в пакете
p9: packet(idempotencePacketId: "contacts-001") {
contact1: createCustomerContact(input: {
id: "customer-contact-1"
contactInfo: "+7 (495) 123-45-67"
customer: "customer-1"
}) {
id contactInfo customer { id }
}
}

p10: packet(idempotencePacketId: "contacts-002") {
contact2: createCustomerContact(input: {
id: "customer-contact-2"
contactInfo: "+7 (495) 987-65-43"
customer: "customer-2"
}) {
id contactInfo customer { id }
}
}

p11: packet(idempotencePacketId: "contacts-003") {
contact3: createCustomerContact(input: {
id: "customer-contact-3"
contactInfo: "+7 (495) 111-22-33"
customer: "customer-3"
}) {
id contactInfo customer { id }
}
}

p12: packet(idempotencePacketId: "contacts-004") {
contact4: createCustomerContact(input: {
id: "customer-contact-4"
contactInfo: "+7 (495) 444-55-66"
customer: "customer-4"
}) {
id contactInfo customer { id }
}
}
}

✅ Проверка создания медицинских сущностей

query CheckMedicalEntities {
doctors: searchDoctor {
elems {
id
doctorType { name }
person { entity { firstName lastName } }
}
}
customers: searchCustomer {
elems {
id insuranceNum
person { entity { firstName lastName } }
}
}
contacts: searchCustomerContact {
elems {
id contactInfo
customer { id }
}
}
}

Ожидаемый результат: 4 врача + 4 пациента + 4 контакта


4. Клиники и кабинеты

mutation CreateClinicsAndOffices {
# Клиники - по одной в пакете
p1: packet(idempotencePacketId: "clinics-001") {
clinic1: createClinic(input: {
id: "clinic-1"
name: "Городская поликлиника №1"
address: {
city: "Москва"
street: "ул. Ленина"
flatNo: "15"
}
}) {
id name address { city street flatNo }
}
}

p2: packet(idempotencePacketId: "clinics-002") {
clinic2: createClinic(input: {
id: "clinic-2"
name: "Медицинский центр 'Здоровье'"
address: {
city: "Москва"
street: "пр. Мира"
flatNo: "32"
}
}) {
id name address { city street flatNo }
}
}

p3: packet(idempotencePacketId: "clinics-003") {
clinic3: createClinic(input: {
id: "clinic-3"
name: "Детская городская больница"
address: {
city: "Москва"
street: "ул. Садовая"
flatNo: "8"
}
}) {
id name address { city street flatNo }
}
}

# Кабинеты - по одному в пакете
p4: packet(idempotencePacketId: "offices-001") {
office1: createClinicOffice(input: {
id: "office-1"
officeNum: "101"
officeType: "office-type-consultation"
clinic: { entityId: "clinic-1" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}

p5: packet(idempotencePacketId: "offices-002") {
office2: createClinicOffice(input: {
id: "office-2"
officeNum: "102"
officeType: "office-type-procedure"
clinic: { entityId: "clinic-1" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}

p6: packet(idempotencePacketId: "offices-003") {
office3: createClinicOffice(input: {
id: "office-3"
officeNum: "201"
officeType: "office-type-surgery"
clinic: { entityId: "clinic-2" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}

p7: packet(idempotencePacketId: "offices-004") {
office4: createClinicOffice(input: {
id: "office-4"
officeNum: "301"
officeType: "office-type-consultation"
clinic: { entityId: "clinic-3" }
}) {
id officeNum officeType { name } clinic { entityId }
}
}
}

✅ Проверка создания клиник и кабинетов

query CheckClinicsAndOffices {
clinics: searchClinic {
elems {
id name address { city street flatNo }
}
}
offices: searchClinicOffice {
elems {
id officeNum
officeType { name }
clinic { entity { name } }
}
}
}

Ожидаемый результат: 3 клиники + 4 кабинета


5. Связи врач-клиника и пациент-клиника, расписания клиник

mutation CreateConnectionsAndClinicSchedules {
# Связи врач-клиника - по одной в пакете
p1: packet(idempotencePacketId: "clinic-doctors-001") {
connection1: createClinicDoctor(input: {
id: "clinic-doctor-1"
clinic: { entityId: "clinic-1" }
doctor: { entityId: "doctor-1" }
}) {
id clinic { entityId } doctor { entityId }
}
}

p2: packet(idempotencePacketId: "clinic-doctors-002") {
connection2: createClinicDoctor(input: {
id: "clinic-doctor-2"
clinic: { entityId: "clinic-2" }
doctor: { entityId: "doctor-2" }
}) {
id clinic { entityId } doctor { entityId }
}
}

p3: packet(idempotencePacketId: "clinic-doctors-003") {
connection3: createClinicDoctor(input: {
id: "clinic-doctor-3"
clinic: { entityId: "clinic-3" }
doctor: { entityId: "doctor-3" }
}) {
id clinic { entityId } doctor { entityId }
}
}

p4: packet(idempotencePacketId: "clinic-doctors-004") {
connection4: createClinicDoctor(input: {
id: "clinic-doctor-4"
clinic: { entityId: "clinic-1" }
doctor: { entityId: "doctor-4" }
}) {
id clinic { entityId } doctor { entityId }
}
}

# Связи пациент-клиника - по одной в пакете
p5: packet(idempotencePacketId: "clinic-customers-001") {
connection1: createClinicCustomer(input: {
id: "clinic-customer-1"
clinic: { entityId: "clinic-1" }
customer: { entityId: "customer-1" }
}) {
id clinic { entityId } customer { entityId }
}
}

p6: packet(idempotencePacketId: "clinic-customers-002") {
connection2: createClinicCustomer(input: {
id: "clinic-customer-2"
clinic: { entityId: "clinic-2" }
customer: { entityId: "customer-2" }
}) {
id clinic { entityId } customer { entityId }
}
}

p7: packet(idempotencePacketId: "clinic-customers-003") {
connection3: createClinicCustomer(input: {
id: "clinic-customer-3"
clinic: { entityId: "clinic-3" }
customer: { entityId: "customer-3" }
}) {
id clinic { entityId } customer { entityId }
}
}

p8: packet(idempotencePacketId: "clinic-customers-004") {
connection4: createClinicCustomer(input: {
id: "clinic-customer-4"
clinic: { entityId: "clinic-1" }
customer: { entityId: "customer-4" }
}) {
id clinic { entityId } customer { entityId }
}
}

# Расписания клиник - по одному в пакете
p9: packet(idempotencePacketId: "clinic-schedules-001") {
schedule1: createClinicSchedule(input: {
id: "clinic-schedule-1"
clinic: { entityId: "clinic-1" }
}) {
id clinic { entityId }
}
}

p10: packet(idempotencePacketId: "clinic-schedules-002") {
schedule2: createClinicSchedule(input: {
id: "clinic-schedule-2"
clinic: { entityId: "clinic-2" }
}) {
id clinic { entityId }
}
}

p11: packet(idempotencePacketId: "clinic-schedules-003") {
schedule3: createClinicSchedule(input: {
id: "clinic-schedule-3"
clinic: { entityId: "clinic-3" }
}) {
id clinic { entityId }
}
}
}

✅ Проверка создания связей и расписаний клиник

query CheckConnectionsAndClinicSchedules {
clinicDoctors: searchClinicDoctor {
elems {
id
clinic { entity { name } }
doctor { entity { doctorType { name } } }
}
}
clinicCustomers: searchClinicCustomer {
elems {
id
clinic { entity { name } }
customer { entity { insuranceNum } }
}
}
clinicSchedules: searchClinicSchedule {
elems {
id clinic { entity { name } }
}
}
}

Ожидаемый результат: 4 связи врач-клиника + 4 связи пациент-клиника + 3 расписания клиник


6. Расписания врачей и записи на прием

Финальный запрос - создаем расписания врачей и записи на прием

mutation CreateDoctorSchedulesAndAppointments {
# Расписания врачей - 10 расписаний, по одному в пакете

# Расписания на 15 января 2026
p1: packet(idempotencePacketId: "doctor-schedules-001") {
schedule1: createDoctorSchedule(input: {
id: "doctor-schedule-1"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-1" }
clinicOffice: { entityId: "office-1" }
beginDate: "2026-01-15T09:00:00Z"
endDate: "2026-01-15T17:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

p2: packet(idempotencePacketId: "doctor-schedules-002") {
schedule2: createDoctorSchedule(input: {
id: "doctor-schedule-2"
clinicSchedule: "clinic-schedule-2"
clinicDoctor: { entityId: "clinic-doctor-2" }
clinicOffice: { entityId: "office-3" }
beginDate: "2026-01-15T08:00:00Z"
endDate: "2026-01-15T16:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

p3: packet(idempotencePacketId: "doctor-schedules-003") {
schedule3: createDoctorSchedule(input: {
id: "doctor-schedule-3"
clinicSchedule: "clinic-schedule-3"
clinicDoctor: { entityId: "clinic-doctor-3" }
clinicOffice: { entityId: "office-4" }
beginDate: "2026-01-15T09:00:00Z"
endDate: "2026-01-15T18:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

p4: packet(idempotencePacketId: "doctor-schedules-004") {
schedule4: createDoctorSchedule(input: {
id: "doctor-schedule-4"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-4" }
clinicOffice: { entityId: "office-2" }
beginDate: "2026-01-15T10:00:00Z"
endDate: "2026-01-15T18:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

# Расписания на 16 января 2026
p5: packet(idempotencePacketId: "doctor-schedules-005") {
schedule5: createDoctorSchedule(input: {
id: "doctor-schedule-5"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-1" }
clinicOffice: { entityId: "office-1" }
beginDate: "2026-01-16T08:30:00Z"
endDate: "2026-01-16T16:30:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

p6: packet(idempotencePacketId: "doctor-schedules-006") {
schedule6: createDoctorSchedule(input: {
id: "doctor-schedule-6"
clinicSchedule: "clinic-schedule-2"
clinicDoctor: { entityId: "clinic-doctor-2" }
clinicOffice: { entityId: "office-3" }
beginDate: "2026-01-16T09:00:00Z"
endDate: "2026-01-16T17:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

p7: packet(idempotencePacketId: "doctor-schedules-007") {
schedule7: createDoctorSchedule(input: {
id: "doctor-schedule-7"
clinicSchedule: "clinic-schedule-3"
clinicDoctor: { entityId: "clinic-doctor-3" }
clinicOffice: { entityId: "office-4" }
beginDate: "2026-01-16T08:00:00Z"
endDate: "2026-01-16T17:30:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

p8: packet(idempotencePacketId: "doctor-schedules-008") {
schedule8: createDoctorSchedule(input: {
id: "doctor-schedule-8"
clinicSchedule: "clinic-schedule-1"
clinicDoctor: { entityId: "clinic-doctor-4" }
clinicOffice: { entityId: "office-2" }
beginDate: "2026-01-16T11:00:00Z"
endDate: "2026-01-16T19:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

# Расписания на 17 января 2026
p9: packet(idempotencePacketId: "doctor-schedules-009") {
schedule9: createDoctorSchedule(input: {
id: "doctor-schedule-9"
clinicSchedule: "clinic-schedule-2"
clinicDoctor: { entityId: "clinic-doctor-1" }
clinicOffice: { entityId: "office-3" }
beginDate: "2026-01-17T09:00:00Z"
endDate: "2026-01-17T15:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

p10: packet(idempotencePacketId: "doctor-schedules-010") {
schedule10: createDoctorSchedule(input: {
id: "doctor-schedule-10"
clinicSchedule: "clinic-schedule-3"
clinicDoctor: { entityId: "clinic-doctor-2" }
clinicOffice: { entityId: "office-4" }
beginDate: "2026-01-17T10:00:00Z"
endDate: "2026-01-17T18:00:00Z"
}) {
id beginDate endDate clinicDoctor { entityId } clinicOffice { entityId }
}
}

# Записи на прием - 10 записей, по одной в пакете

p11: packet(idempotencePacketId: "appointments-001") {
appointment1: createDoctorAppointment(input: {
id: "appointment-1"
descr: "Плановый профилактический осмотр"
doctorSchedule: "doctor-schedule-1"
clinicCustomer: { entityId: "clinic-customer-1" }
beginDate: "2026-01-15T10:00:00Z"
endDate: "2026-01-15T10:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p12: packet(idempotencePacketId: "appointments-002") {
appointment2: createDoctorAppointment(input: {
id: "appointment-2"
descr: "Консультация по поводу планируемой операции"
doctorSchedule: "doctor-schedule-2"
clinicCustomer: { entityId: "clinic-customer-2" }
beginDate: "2026-01-15T11:00:00Z"
endDate: "2026-01-15T11:45:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p13: packet(idempotencePacketId: "appointments-003") {
appointment3: createDoctorAppointment(input: {
id: "appointment-3"
descr: "Диспансеризация ребенка"
doctorSchedule: "doctor-schedule-3"
clinicCustomer: { entityId: "clinic-customer-3" }
beginDate: "2026-01-15T14:00:00Z"
endDate: "2026-01-15T14:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p14: packet(idempotencePacketId: "appointments-004") {
appointment4: createDoctorAppointment(input: {
id: "appointment-4"
descr: "Обследование сердечно-сосудистой системы"
doctorSchedule: "doctor-schedule-4"
clinicCustomer: { entityId: "clinic-customer-4" }
beginDate: "2026-01-15T15:00:00Z"
endDate: "2026-01-15T15:45:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p15: packet(idempotencePacketId: "appointments-005") {
appointment5: createDoctorAppointment(input: {
id: "appointment-5"
descr: "Повторная консультация по результатам анализов"
doctorSchedule: "doctor-schedule-1"
clinicCustomer: { entityId: "clinic-customer-1" }
beginDate: "2026-01-15T16:00:00Z"
endDate: "2026-01-15T16:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p16: packet(idempotencePacketId: "appointments-006") {
appointment6: createDoctorAppointment(input: {
id: "appointment-6"
descr: "Вакцинация против гриппа"
doctorSchedule: "doctor-schedule-5"
clinicCustomer: { entityId: "clinic-customer-2" }
beginDate: "2026-01-16T09:00:00Z"
endDate: "2026-01-16T09:15:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p17: packet(idempotencePacketId: "appointments-007") {
appointment7: createDoctorAppointment(input: {
id: "appointment-7"
descr: "Предоперационное обследование"
doctorSchedule: "doctor-schedule-6"
clinicCustomer: { entityId: "clinic-customer-3" }
beginDate: "2026-01-16T10:30:00Z"
endDate: "2026-01-16T11:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p18: packet(idempotencePacketId: "appointments-008") {
appointment8: createDoctorAppointment(input: {
id: "appointment-8"
descr: "Осмотр после болезни"
doctorSchedule: "doctor-schedule-7"
clinicCustomer: { entityId: "clinic-customer-4" }
beginDate: "2026-01-16T14:00:00Z"
endDate: "2026-01-16T14:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p19: packet(idempotencePacketId: "appointments-009") {
appointment9: createDoctorAppointment(input: {
id: "appointment-9"
descr: "Кардиологическое обследование с ЭКГ"
doctorSchedule: "doctor-schedule-8"
clinicCustomer: { entityId: "clinic-customer-1" }
beginDate: "2026-01-16T16:00:00Z"
endDate: "2026-01-16T17:00:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}

p20: packet(idempotencePacketId: "appointments-010") {
appointment10: createDoctorAppointment(input: {
id: "appointment-10"
descr: "Контрольный осмотр после лечения"
doctorSchedule: "doctor-schedule-9"
clinicCustomer: { entityId: "clinic-customer-2" }
beginDate: "2026-01-17T11:00:00Z"
endDate: "2026-01-17T11:30:00Z"
}) {
id descr beginDate endDate clinicCustomer { entityId }
}
}
}

✅ Проверка создания расписаний и записей

query CheckDoctorSchedulesAndAppointments {
doctorSchedules: searchDoctorSchedule {
elems {
id beginDate endDate
clinicDoctor {
entity {
doctor {
entity {
doctorType { name }
person { entity { firstName lastName } }
}
}
}
}
clinicOffice {
entity {
officeNum
officeType { name }
}
}
}
}

appointments: searchDoctorAppointment {
elems {
id descr beginDate endDate
doctorSchedule {
clinicDoctor {
entity {
doctor {
entity {
doctorType { name }
person { entity { firstName lastName } }
}
}
}
}
}
clinicCustomer {
entity {
customer {
entity {
person { entity { firstName lastName } }
}
}
}
}
}
}
}

Ожидаемый результат: 10 расписаний врачей + 10 записей на прием

📋 Описание структуры демо-данных расписаний врачей и записей на прием

📅 Расписания врачей (10 единиц)

Временное распределение:

  • 15 января 2026: 4 расписания (утренние и дневные смены)

    • doctor-schedule-1: Терапевт в кабинете 101 (09:00-17:00)
    • doctor-schedule-2: Хирург в операционной 201 (08:00-16:00)
    • doctor-schedule-3: Педиатр в кабинете 301 (09:00-18:00)
    • doctor-schedule-4: Кардиолог в процедурном кабинете 102 (10:00-18:00)
  • 16 января 2026: 4 расписания (разнообразные смены)

    • doctor-schedule-5: Терапевт в кабинете 101 (08:30-16:30)
    • doctor-schedule-6: Хирург в операционной 201 (09:00-17:00)
    • doctor-schedule-7: Педиатр в кабинете 301 (08:00-17:30)
    • doctor-schedule-8: Кардиолог в процедурном кабинете 102 (11:00-19:00)
  • 17 января 2026: 2 расписания (дневные смены)

    • doctor-schedule-9: Терапевт в операционной 201 (09:00-15:00)
    • doctor-schedule-10: Хирург в кабинете 301 (10:00-18:00)

Врачебная нагрузка:

  • Терапевт (Анна Петрова): 3 расписания на разные дни
  • Хирург (Михаил Сидоров): 3 расписания
  • Педиатр (Елена Козлова): 2 расписания
  • Кардиолог (Владимир Николаев): 2 расписания

Использование кабинетов:

  • Консультационные кабинеты (101, 301): 5 расписаний
  • Процедурный кабинет (102): 2 расписания
  • Операционная (201): 3 расписания

🏥 Записи на прием (10 единиц)

15 января 2026 (5 записей):

  • appointment-1: Профилактический осмотр у терапевта (10:00-10:30)
  • appointment-2: Консультация у хирурга (11:00-11:45)
  • appointment-3: Диспансеризация ребенка у педиатра (14:00-14:30)
  • appointment-4: Кардиологическое обследование (15:00-15:45)
  • appointment-5: Повторная консультация у терапевта (16:00-16:30)

16 января 2026 (4 записей):

  • appointment-6: Вакцинация у терапевта (09:00-09:15)
  • appointment-7: Предоперационное обследование у хирурга (10:30-11:30)
  • appointment-8: Осмотр после болезни у педиатра (14:00-14:30)
  • appointment-9: ЭКГ у кардиолога (16:00-17:00)

17 января 2026 (1 запись):

  • appointment-10: Контрольный осмотр у терапевта (11:00-11:30)

Медицинские сценарии:

  1. Профилактика: Плановые осмотры, диспансеризация, вакцинация
  2. Специализированная помощь: Кардиологические обследования, предоперационная подготовка
  3. Последующее наблюдение: Контрольные осмотры, консультации по результатам анализов
  4. Экстренная помощь: Осмотры после болезни

Временные интервалы:

  • Короткие (15 мин): Вакцинация
  • Стандартные (30 мин): Плановые осмотры, контрольные визиты
  • Длительные (45-60 мин): Специализированные обследования, консультации

Распределение пациентов:

  • Иван Иванов (customer-1): 3 записи (профилактика, повторная консультация, ЭКГ)
  • Мария Смирнова (customer-2): 3 записи (хирургическая консультация, вакцинация, контрольный осмотр)
  • Алексей Волков (customer-3): 2 записи (диспансеризация, предоперационное обследование)
  • Татьяна Федорова (customer-4): 2 записи (кардиологическое обследование, осмотр после болезни)

Реалистичность данных:

  • Разные длительности приемов в зависимости от типа услуги
  • Специализация кабинетов под определенные виды деятельности
  • Повторные обращения пациентов
  • Междисциплинарное взаимодействие (пациенты посещают врачей разных специальностей)
  • Логичное распределение нагрузки по дням недели

Данная информация может быть использована для изучения структуры данных и их взаимосвязей, а также возможностей GraphQL для работы с данными.


🔍 Финальная комплексная проверка целостности созданных демо-данных

query FinalDemoDataIntegrityCheck {
# Подсчет всех созданных сущностей
doctorTypesCount: searchDoctorType { count }
officeTypesCount: searchOfficeType { count }
personsCount: searchPerson { count }
doctorsCount: searchDoctor { count }
customersCount: searchCustomer { count }
clinicsCount: searchClinic { count }
officesCount: searchClinicOffice { count }
clinicDoctorsCount: searchClinicDoctor { count }
clinicCustomersCount: searchClinicCustomer { count }
clinicSchedulesCount: searchClinicSchedule { count }
doctorSchedulesCount: searchDoctorSchedule { count }
appointmentsCount: searchDoctorAppointment { count }
contactsCount: searchCustomerContact { count }

# Проверка связей
doctorTypes: searchDoctorType {
elems { id name }
}
officeTypes: searchOfficeType {
elems { id name }
}
}

Ожидаемые результаты проверки целостности:

СущностьКоличествоЗапросОписание
DoctorType41терапевт, хирург, педиатр, кардиолог
OfficeType31консультационный, процедурный, операционная
Person824 врача + 4 пациента
Doctor43по одному каждого типа
Customer43пациенты с уникальными страховками
CustomerContact43контактные данные пациентов
Clinic34поликлиника, мед.центр, детская больница
ClinicOffice44кабинеты разных типов
ClinicDoctor45привязки врачей к клиникам
ClinicCustomer45привязки пациентов к клиникам
ClinicSchedule35общие расписания клиник
DoctorSchedule106индивидуальные расписания врачей
DoctorAppointment106записи на прием

Заключение

В рамках данного раздела была создана полноценная демо-база данных медицинской информационной системы, состоящая из 13 типов сущностей и 67 записей. Процесс создания был структурирован в 6 последовательных этапов, что обеспечило корректное формирование всех связей между данными.

Особенности созданного набора данных

Структурная целостность:

  • Создана реалистичная модель медицинского учреждения с 3 клиниками, 4 врачами разных специальностей и 4 пациентами
  • Установлены все необходимые связи между сущностями (врач-клиника, пациент-клиника, расписания)
  • Реализованы временные связи с реалистичными расписаниями и записями на прием

Практическая применимость:

  • Данные покрывают основные медицинские сценарии: профилактические осмотры, специализированную помощь, контрольные визиты
  • Временные интервалы соответствуют реальной практике (от 15 минут для вакцинации до 60 минут для сложных обследований)
  • Демонстрируется работа с различными типами кабинетов и специализацией врачей

Техническая эффективность:

  • Использование пакетов (packet) и идемпотентности предотвращает дублирование данных
  • GraphQL-мутации оптимизированы для минимизации количества запросов

Дальнейшее использование демо-данных

Созданные демо-данные станут основой для изучения и практического освоения всех последующих разделов курса. Все последующие примеры и практические задания в курсе будут ссылаться на созданные идентификаторы (doctor-1, customer-1, clinic-1 и т.д.), поэтому пожалуйста сохраните созданные данные для дальнейшей работы.